#!/bin/bash

# ==============================================================================
# BenchmarkSQL Parallel Runner Script
# ==============================================================================

# --- 默认配置 ---
# 根据您的描述，BenchmarkSQL 安装在 /root/benchmarksql-5.0
BENCHMARKSQL_HOME="/root/benchmarksql-5.0"
MYSQL_USER="root"
MYSQL_PWD="test@2025" # 和 setup_mysql_instances.sh 保持一致
DB_NAME_BASE="benchmarksql"
OUTPUT_DIR_BASE="./benchmarksql_results"

# --- 函数：显示用法 ---
usage() {
    echo "用法: $0 -p <端口列表> -f <属性文件路径> [--load]"
    echo ""
    echo "参数:"
    echo "  -p <列表>      用逗号分隔的 MySQL 实例端口列表 (必需)。"
    echo "  -f <文件路径>  由 Python 脚本生成的 BenchmarkSQL 基础属性文件路径 (必需)。"
    echo "  --load         (标志) 如果指定，则运行数据加载阶段 (runDatabaseBuild.sh)。"
    echo ""
    echo "示例:"
    echo "  # 加载数据并运行测试"
    echo "  $0 -p 3307,3308 -f /path/to/props.properties --load"
    echo ""
    echo "  # 仅运行测试 (数据已存在)"
    echo "  $0 -p 3307,3308 -f /path/to/props.properties"
    exit 1
}

# --- 解析参数 ---
LOAD_DATA="false"
PORTS_STR=""
PROPS_FILE=""

while [[ "$#" -gt 0 ]]; do
    case $1 in
        -p) PORTS_STR="$2"; shift ;;
        -f) PROPS_FILE="$2"; shift ;;
        --load) LOAD_DATA="true" ;;
        *) echo "错误: 未知参数: $1"; usage ;;
    esac
    shift
done

if [ -z "$PORTS_STR" ] || [ -z "$PROPS_FILE" ]; then
    echo "错误: 必须提供端口列表 (-p) 和属性文件路径 (-f)。"
    usage
fi
if [ ! -f "$PROPS_FILE" ]; then
    echo "错误: 找不到指定的属性文件: $PROPS_FILE"
    exit 1
fi
if [ ! -d "$BENCHMARKSQL_HOME/run" ]; then
    echo "错误: 找不到 BenchmarkSQL 执行目录: $BENCHMARKSQL_HOME/run"
    exit 1
fi

IFS=',' read -r -a PORTS <<< "$PORTS_STR"

# --- 函数：为单个实例运行 BenchmarkSQL ---
run_benchmarksql_for_instance() {
    local port=$1
    local db_name="${DB_NAME_BASE}_p${port}"
    local output_dir_instance="${OUTPUT_DIR_BASE}/port_${port}"
    # 为每个实例创建一个临时的、唯一的属性文件
    local props_file_instance=$(mktemp "/tmp/props_${port}_XXXX.properties")

    mkdir -p "$output_dir_instance"
    
    echo "--- [端口 ${port}] 开始 BenchmarkSQL 任务 ---"

    # 1. 创建特定于实例的属性文件
    # 复制基础配置，然后用 sed 修改关键的、特定于实例的参数
    cp "$PROPS_FILE" "$props_file_instance"
    sed -i "s|^conn=.*|conn=jdbc:mysql://127.0.0.1:${port}/${db_name}?useSSL=false|" "$props_file_instance"
    sed -i "s|^resultDirectory=.*|resultDirectory=${output_dir_instance}/my_result_%tY-%tm-%td_%tH%tM%tS|" "$props_file_instance"
    
    # 2. 准备数据库
    echo "[端口 ${port}] 正在创建数据库 '${db_name}'..."
    mysql -h 127.0.0.1 -P "$port" -u"$MYSQL_USER" -p"$MYSQL_PWD" -e "DROP DATABASE IF EXISTS \`${db_name}\`; CREATE DATABASE \`${db_name}\`;"
    if [ $? -ne 0 ]; then
        echo "错误: [端口 ${port}] 无法连接到 MySQL 或创建数据库。跳过此实例。"
        rm -f "$props_file_instance"
        return 1
    fi

    # 切换到 benchmarksql 的 run 目录
    cd "$BENCHMARKSQL_HOME/run" || return 1

    # 3. 如果需要，加载数据
    if [ "$LOAD_DATA" == "true" ]; then
        echo "[端口 ${port}] 正在加载数据 (DB=${db_name})..."
        if ! ./runDatabaseBuild.sh "$props_file_instance"; then
            echo "错误: [端口 ${port}] 数据加载失败。"
            rm -f "$props_file_instance"
            return 1
        fi
        echo "[端口 ${port}] 数据加载完成。"
    fi

    # 4. 运行基准测试
    echo "[端口 ${port}] 正在运行基准测试..."
    if ! ./runBenchmark.sh "$props_file_instance"; then
        echo "错误: [端口 ${port}] 基准测试失败。"
        rm -f "$props_file_instance"
        return 1
    fi
    echo "[端口 ${port}] 基准测试完成。结果保存在: ${output_dir_instance}"
    
    # 清理临时文件
    rm -f "$props_file_instance"
    return 0
}

# --- 并行运行所有测试 ---
echo "--- 开始并行运行 BenchmarkSQL 测试 ---"
echo "端口: ${PORTS_STR}"
echo "加载数据: ${LOAD_DATA}"
echo "基础属性文件: ${PROPS_FILE}"

pids=()
for port in "${PORTS[@]}"; do
    run_benchmarksql_for_instance "$port" &
    pids+=($!)
done

# 等待所有后台任务完成
status=0
for pid in "${pids[@]}"; do
    wait "$pid" || status=1
done

if [ $status -ne 0 ]; then
    echo "警告: 一个或多个 BenchmarkSQL 测试未成功完成。"
    exit 1
fi

echo "所有 BenchmarkSQL 基准测试已完成。"